﻿using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace YougeBookmark.Models
{
    /// <summary>
    /// 标签数据模型（对应数据库tags表）
    /// 功能说明：
    /// 1. 存储标签基本信息
    /// 2. 维护与书签的多对多关系
    /// 3. 支持创建时间追踪
    /// </summary>
    [Table("tags")] // 明确映射表名
    public class Tag
    {
        private string _name;
        private DateTime _createdTime;

        /// <summary>
        /// 初始化标签实例（自动设置创建时间）
        /// </summary>
        public Tag()
        {
            BookmarkTags = new HashSet<BookmarkTag>();
            _createdTime = DateTime.Now;
        }

        /// <summary>
        /// 标签唯一标识（自增主键）
        /// </summary>
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        [Column("id")]
        public int Id { get; set; }

        /// <summary>
        /// 标签名称（唯一约束，最大长度50字符）
        /// 设置时自动执行：
        /// 1. 去除首尾空格
        /// 2. 空值检查
        /// </summary>
        [Required(ErrorMessage = "标签名称不能为空")]
        [MaxLength(50, ErrorMessage = "标签名称长度不能超过50字符")]
        [Column("name", TypeName = "varchar(50)")]
        public string Name
        {
            get => _name;
            set
            {
                if (string.IsNullOrWhiteSpace(value))
                    throw new ArgumentException("标签名称不能为空");

                _name = value.Trim();
            }
        }

        /// <summary>
        /// 标签详细说明（允许空值，最大长度200字符）
        /// </summary>
        [MaxLength(200, ErrorMessage = "标签说明长度不能超过200字符")]
        [Column("description")]
        public string Description { get; set; }

        /// <summary>
        /// 创建时间（UTC标准时间，禁止修改）
        /// </summary>
        [Column("created_time")]
        public DateTime CreatedTime
        {
            get => _createdTime.ToUniversalTime();
            private set => _createdTime = value;
        }

        /// <summary>
        /// 与书签的关联关系（多对多导航属性）
        /// </summary>
        public virtual ICollection<BookmarkTag> BookmarkTags { get; set; }

        /// <summary>
        /// 更新标签基本信息（保持创建时间不变）
        /// </summary>
        /// <param name="newName">新名称（自动Trim处理）</param>
        /// <param name="newDescription">新说明（空值自动转换）</param>
        public void Update(string newName, string newDescription = null)
        {
            if (!string.IsNullOrWhiteSpace(newName))
                Name = newName;

            Description = string.IsNullOrWhiteSpace(newDescription)
                ? null
                : newDescription.Trim();
        }

        /// <summary>
        /// 验证标签数据有效性（持久化前调用）
        /// </summary>
        /// <exception cref="ArgumentException">数据无效时抛出</exception>
        public void Validate()
        {
            if (string.IsNullOrWhiteSpace(Name))
                throw new ArgumentException("标签名称不能为空");

            if (Name.Length > 50)
                throw new ArgumentException("标签名称过长");

            if (Description?.Length > 200)
                throw new ArgumentException("标签说明过长");
        }

        /// <summary>
        /// 显示标签摘要信息（调试用）
        /// </summary>
        public override string ToString()
        {
            return $"{Name} - {Description?.Substring(0, Math.Min(20, Description.Length)) ?? "无说明"}";
        }
    }
}